  10 REM A DRAW AN ARC PROGRAM
  15 BORDER 0: PAPER 0: INK 7: CLS
  20 PLOT 75,35: REM just a suitable starting position
  30 INPUT "X value ";X: PRINT "X = ";X;
  40 INPUT "Y value ";Y: PRINT TAB 10;"Y = ";Y;
  50 INPUT "Angle ";G: PRINT TAB 20;"Angle = ";G
  55 INPUT "Limit angle to 2*PI (y/n)?";R$: IF R$="y" THEN LET G=G-2*PI*INT (G/2*PI)
  60 REM How many arcs?
  70 LET Z=ABS ((ABS X+ABS Y)/SIN (G/2))
  80 LET Arcs=4*INT (INT (ABS (G*SQR Z)+0.5)/8)+4
  90 IF Arcs>252 THEN LET Arcs=252
 100 PRINT '"ARCS = ";Arcs
 110 LET W=SIN (G/(2*Arcs))/SIN (G/2)
 120 LET M0=PEEK 23678
 130 LET SC=PEEK 23677
 140 LET F=.5*(G-G/Arcs)
 150 LET M1=Y*W*SIN F+X*W*COS F
 160 LET M2=Y*W*COS F-X*W*SIN F
 170 LET M3=COS (G/Arcs)
 180 LET M4=SIN (G/Arcs)
 200 REM 'DRAW THE ARCS'
 210 LET M0=M0+M2
 220 LET SC=SC+M1
 230 LET X=SC-PEEK 23677
 240 LET Y=M0-PEEK 23678
 250 GO SUB 510
 260 LET Arcs=Arcs-1: IF Arcs=0 THEN STOP
 270 LET MM1=M1
 280 LET M1=M1*M3-M2*M4
 290 LET M2=MM1*M4+M2*M3
 300 GO TO 210
 500 REM 'DRAW A LINE' from lastposition to X,Y
 510 LET PlotX=PEEK 23677: LET PlotY=PEEK 23678
 520 LET dX=SGN X: LET dY=SGN Y
 530 LET X=ABS X: LET Y=ABS Y
 540 IF X>=Y THEN GO TO 580
 550 LET L=X: LET B=Y
 560 LET ddX=0: LET ddY=dY
 570 GO TO 610
 580 IF X+Y=0 THEN STOP
 590 LET L=Y: LET B=X
 600 LET ddX=dX: LET ddY=0
 610 LET H=B
 620 LET i=INT (B/2)
 630 FOR N=B TO 1 STEP -1
 640 LET i=i+L
 650 IF i<H THEN GOTO 690
 660 LET i=i-H
 670 LET iX=dX: LET iY=dY
 680 GO TO 700
 690 LET iX=ddX: LET iY=ddY
 700 LET PlotY=PlotY+iY
 710 IF PlotY<0 OR PlotY>175 THEN STOP
 720 LET PlotX=PlotX+iX
 730 IF PlotX<0 OR PlotX>255 THEN STOP
 740 PLOT PlotX,PlotY
 750 NEXT N
 760 RETURN
